using System.Threading.Tasks;
using ComputeSharp.D2D1.SourceGenerators;
using ComputeSharp.Tests.SourceGenerators.Helpers;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace ComputeSharp.D2D1.Tests.SourceGenerators;

[TestClass]
public class Test_D2DPixelShaderDescriptorGenerator
{
    [TestMethod]
    public async Task SimpleShader()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using int2 = global::ComputeSharp.Int2;
            using float2 = global::ComputeSharp.Float2;
            using float3 = global::ComputeSharp.Float3;
            using float4 = global::ComputeSharp.Float4;

            [assembly: D2DEnableRuntimeCompilation]

            namespace MyNamespace;

            [D2DInputCount(0)]
            [D2DRequiresScenePosition]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader : ID2D1PixelShader
            {
                private readonly float time;
                private readonly int2 dispatchSize;

                public float4 Execute()
                {
                    int2 xy = (int2)D2D.GetScenePosition().XY;
                    float2 uv = xy / (float2)this.dispatchSize;
                    float3 col = 0.5f + (0.5f * Hlsl.Cos(this.time + new float3(uv, uv.X) + new float3(0, 2, 4)));
                    return new(col, 1f);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0xF4, 0xE8, 0x90, 0x26,
                                0x36, 0xE8,
                                0x71, 0x89,
                                0x25,
                                0x1F,
                                0x69,
                                0xE1,
                                0x5F,
                                0x27,
                                0x60,
                                0xBE
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 12;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 0
                        #define D2D_REQUIRES_SCENE_POSITION

                        #include "d2d1effecthelpers.hlsli"

                        float time;
                        int2 dispatchSize;

                        D2D_PS_ENTRY(Execute)
                        {
                            int2 xy = (int2)D2DGetScenePosition().xy;
                            float2 uv = xy / (float2)dispatchSize;
                            float3 col = asfloat(1056964608U) + (asfloat(1056964608U) * cos(time + float3(uv, uv.x) + float3(0, 2, 4)));
                            return float4(col, asfloat(1065353216U));
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        ref readonly global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer = ref global::System.Runtime.InteropServices.MemoryMarshal.AsRef<global::ComputeSharp.D2D1.Generated.ConstantBuffer>(data);

                        return global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.ToManaged(in buffer);
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static unsafe void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        global::System.Runtime.CompilerServices.Unsafe.SkipInit(out global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer);

                        global::System.Runtime.InteropServices.NativeMemory.Clear(&buffer, (uint)sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer));

                        global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.FromManaged(in shader, out buffer);

                        loader.LoadConstantBuffer(new global::System.ReadOnlySpan<byte>(&buffer, sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer)));
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::System.Runtime.CompilerServices;
                using global::System.Runtime.InteropServices;

                /// <summary>
                /// A type representing the constant buffer native layout for <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                [StructLayout(LayoutKind.Explicit, Size = 12)]
                file struct ConstantBuffer
                {
                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    [FieldOffset(0)]
                    public float time;

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    [FieldOffset(4)]
                    public int2 dispatchSize;
                }

                /// <summary>
                /// A type containing marshalling logic for the constant buffer in shaders of type <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class ConstantBufferMarshaller
                {
                    /// <summary>
                    /// Marshals managed <see cref="global::MyNamespace.MyShader"/> instances to native constant buffer data.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static void FromManaged(in global::MyNamespace.MyShader shader, out ConstantBuffer buffer)
                    {
                        buffer.time = shader.time();
                        buffer.dispatchSize = shader.dispatchSize();
                    }

                    /// <summary>
                    /// Marshals native constant buffer data to managed <see cref="global::MyNamespace.MyShader"/> instances.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static global::MyNamespace.MyShader ToManaged(ref readonly ConstantBuffer buffer)
                    {
                        Unsafe.SkipInit(out global::MyNamespace.MyShader shader);

                        shader.time() = buffer.time;
                        shader.dispatchSize() = buffer.dispatchSize;

                        return shader;
                    }

                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.time"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref float time(this ref readonly global::MyNamespace.MyShader value);

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.dispatchSize"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref int2 dispatchSize(this ref readonly global::MyNamespace.MyShader value);
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    [TestMethod]
    public async Task SimpleShader_WithCompiledHlslBytecode()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using int2 = global::ComputeSharp.Int2;
            using float2 = global::ComputeSharp.Float2;
            using float3 = global::ComputeSharp.Float3;
            using float4 = global::ComputeSharp.Float4;

            namespace MyNamespace;

            [D2DInputCount(0)]
            [D2DRequiresScenePosition]
            [D2DShaderProfile(D2D1ShaderProfile.PixelShader50)]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader : ID2D1PixelShader
            {
                private readonly float time;
                private readonly int2 dispatchSize;

                public float4 Execute()
                {
                    int2 xy = (int2)D2D.GetScenePosition().XY;
                    float2 uv = xy / (float2)this.dispatchSize;
                    float3 col = 0.5f + (0.5f * Hlsl.Cos(this.time + new float3(uv, uv.X) + new float3(0, 2, 4)));
                    return new(col, 1f);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0xF4, 0xE8, 0x90, 0x26,
                                0x36, 0xE8,
                                0x71, 0x89,
                                0x25,
                                0x1F,
                                0x69,
                                0xE1,
                                0x5F,
                                0x27,
                                0x60,
                                0xBE
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 12;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 0
                        #define D2D_REQUIRES_SCENE_POSITION

                        #include "d2d1effecthelpers.hlsli"

                        float time;
                        int2 dispatchSize;

                        D2D_PS_ENTRY(Execute)
                        {
                            int2 xy = (int2)D2DGetScenePosition().xy;
                            float2 uv = xy / (float2)dispatchSize;
                            float3 col = asfloat(1056964608U) + (asfloat(1056964608U) * cos(time + float3(uv, uv.x) + float3(0, 2, 4)));
                            return float4(col, asfloat(1065353216U));
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => global::ComputeSharp.D2D1.Generated.HlslBytecodeMemoryManager.Instance.Memory;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        ref readonly global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer = ref global::System.Runtime.InteropServices.MemoryMarshal.AsRef<global::ComputeSharp.D2D1.Generated.ConstantBuffer>(data);

                        return global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.ToManaged(in buffer);
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static unsafe void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        global::System.Runtime.CompilerServices.Unsafe.SkipInit(out global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer);

                        global::System.Runtime.InteropServices.NativeMemory.Clear(&buffer, (uint)sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer));

                        global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.FromManaged(in shader, out buffer);

                        loader.LoadConstantBuffer(new global::System.ReadOnlySpan<byte>(&buffer, sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer)));
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System;
                using global::System.Buffers;
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::System.Runtime.CompilerServices;
                using global::System.Runtime.InteropServices;

                /// <summary>
                /// A type representing the constant buffer native layout for <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                [StructLayout(LayoutKind.Explicit, Size = 12)]
                file struct ConstantBuffer
                {
                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    [FieldOffset(0)]
                    public float time;

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    [FieldOffset(4)]
                    public int2 dispatchSize;
                }

                /// <summary>
                /// A type containing marshalling logic for the constant buffer in shaders of type <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class ConstantBufferMarshaller
                {
                    /// <summary>
                    /// Marshals managed <see cref="global::MyNamespace.MyShader"/> instances to native constant buffer data.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static void FromManaged(in global::MyNamespace.MyShader shader, out ConstantBuffer buffer)
                    {
                        buffer.time = shader.time();
                        buffer.dispatchSize = shader.dispatchSize();
                    }

                    /// <summary>
                    /// Marshals native constant buffer data to managed <see cref="global::MyNamespace.MyShader"/> instances.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static global::MyNamespace.MyShader ToManaged(ref readonly ConstantBuffer buffer)
                    {
                        Unsafe.SkipInit(out global::MyNamespace.MyShader shader);

                        shader.time() = buffer.time;
                        shader.dispatchSize() = buffer.dispatchSize;

                        return shader;
                    }

                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.time"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref float time(this ref readonly global::MyNamespace.MyShader value);

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.dispatchSize"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref int2 dispatchSize(this ref readonly global::MyNamespace.MyShader value);
                }

                /// <summary>
                /// <see cref="MemoryManager{T}"/> implementation to get the HLSL bytecode.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file sealed class HlslBytecodeMemoryManager : MemoryManager<byte>
                {
                    /// <summary>The singleton <see cref="HlslBytecodeMemoryManager"/> instance to use.</summary>
                    public static readonly HlslBytecodeMemoryManager Instance = new();

                    /// <summary>The RVA data with the HLSL bytecode.</summary>
                    private static ReadOnlySpan<byte> Data => [0x44, 0x58, 0x42, 0x43, 0x00, 0x7E, 0x4F, 0xA0, 0xD0, 0x90, 0x42, 0x20, 0xBA, 0x51, 0xF0, 0x59, 0x1A, 0x83, 0x95, 0x27, 0x01, 0x00, 0x00, 0x00, 0xB7, 0x08, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0xA0, 0x01, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0x70, 0x03, 0x00, 0x00, 0x0C, 0x04, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x60, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0x08, 0x81, 0x04, 0x00, 0x38, 0x01, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x73, 0x00, 0xAB, 0xAB, 0xAB, 0x5C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6D, 0x65, 0x00, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x00, 0xAB, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x00, 0x00, 0x00, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x69, 0x6E, 0x74, 0x32, 0x00, 0xAB, 0xAB, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4C, 0x53, 0x4C, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2E, 0x31, 0x00, 0x49, 0x53, 0x47, 0x4E, 0x54, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5F, 0x50, 0x4F, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x00, 0x53, 0x43, 0x45, 0x4E, 0x45, 0x5F, 0x50, 0x4F, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x00, 0xAB, 0x4F, 0x53, 0x47, 0x4E, 0x2C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5F, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xAB, 0xAB, 0x53, 0x48, 0x45, 0x58, 0x38, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x6A, 0x08, 0x00, 0x01, 0x59, 0x00, 0x00, 0x04, 0x46, 0x8E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xF2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x05, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x06, 0x72, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x96, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x06, 0x00, 0xD0, 0x00, 0x00, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0F, 0x72, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x82, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x3E, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x52, 0x49, 0x56, 0xA3, 0x04, 0x00, 0x00, 0x44, 0x58, 0x42, 0x43, 0x77, 0xD5, 0x53, 0x7B, 0x34, 0xFD, 0x69, 0xC9, 0x7D, 0xA1, 0x85, 0x94, 0xB1, 0x52, 0x5A, 0xD7, 0x01, 0x00, 0x00, 0x00, 0xA3, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x4C, 0x49, 0x42, 0x46, 0x18, 0x04, 0x00, 0x00, 0x44, 0x58, 0x42, 0x43, 0x03, 0xE1, 0xA2, 0x41, 0x4F, 0x11, 0x4D, 0xCB, 0x79, 0x2A, 0xB6, 0x76, 0xCD, 0xD1, 0x6C, 0xF7, 0x01, 0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x3C, 0x02, 0x00, 0x00, 0x7C, 0x03, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x60, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x05, 0x46, 0x4C, 0x08, 0x81, 0x04, 0x00, 0x38, 0x01, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3C, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x73, 0x00, 0xAB, 0xAB, 0xAB, 0x5C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x74, 0x69, 0x6D, 0x65, 0x00, 0x66, 0x6C, 0x6F, 0x61, 0x74, 0x00, 0xAB, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x00, 0x00, 0x00, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x69, 0x6E, 0x74, 0x32, 0x00, 0xAB, 0xAB, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x01, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4C, 0x53, 0x4C, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2E, 0x31, 0x00, 0x4C, 0x46, 0x53, 0x30, 0x9C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0x32, 0x44, 0x5F, 0x66, 0x75, 0x6E, 0x63, 0x5F, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x00, 0x5F, 0x5F, 0x64, 0x32, 0x64, 0x69, 0x6E, 0x70, 0x75, 0x74, 0x5F, 0x73, 0x63, 0x65, 0x6E, 0x65, 0x50, 0x6F, 0x73, 0x00, 0x53, 0x43, 0x45, 0x4E, 0x45, 0x5F, 0x50, 0x4F, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x00, 0xAB, 0xAB, 0x53, 0x48, 0x45, 0x58, 0x38, 0x01, 0x00, 0x00, 0x50, 0x00, 0xF0, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x6A, 0x08, 0x00, 0x01, 0x59, 0x00, 0x00, 0x04, 0x46, 0x8E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xF2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x05, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x06, 0x72, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x96, 0x85, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x07, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x06, 0x00, 0xD0, 0x00, 0x00, 0x72, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0F, 0x72, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x82, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x3E, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x49, 0x42, 0x48, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4C, 0x53, 0x4C, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6F, 0x6D, 0x70, 0x69, 0x6C, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2E, 0x31, 0x00, 0x44, 0x32, 0x44, 0x5F, 0x66, 0x75, 0x6E, 0x63, 0x5F, 0x65, 0x6E, 0x74, 0x72, 0x79, 0x00];

                    /// <inheritdoc/>
                    public override unsafe Span<byte> GetSpan()
                    {
                        return new(Unsafe.AsPointer(ref MemoryMarshal.GetReference(Data)), Data.Length);
                    }

                    /// <inheritdoc/>
                    public override Memory<byte> Memory
                    {
                        [MethodImpl(MethodImplOptions.AggressiveInlining)]
                        get => CreateMemory(Data.Length);
                    }

                    /// <inheritdoc/>
                    public override unsafe MemoryHandle Pin(int elementIndex)
                    {
                        return new(Unsafe.AsPointer(ref Unsafe.AsRef(in Data[elementIndex])), pinnable: this);
                    }

                    /// <inheritdoc/>
                    public override void Unpin()
                    {
                    }

                    /// <inheritdoc/>
                    protected override void Dispose(bool disposing)
                    {
                    }
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    [TestMethod]
    public async Task SimpleShader_WithEffectMetadata()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using int2 = global::ComputeSharp.Int2;
            using float2 = global::ComputeSharp.Float2;
            using float3 = global::ComputeSharp.Float3;
            using float4 = global::ComputeSharp.Float4;

            [assembly: D2DEnableRuntimeCompilation]

            namespace MyNamespace;

            [D2DEffectId("B30E1384-DEE1-4200-9312-321521DF3B00")]
            [D2DEffectDisplayName(nameof(MyShader))]
            [D2DEffectDescription("A hello world effect that displays a color gradient.")]
            [D2DEffectCategory("Render")]
            [D2DEffectAuthor("ComputeSharp.D2D1")]
            [D2DInputCount(0)]
            [D2DRequiresScenePosition]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader : ID2D1PixelShader
            {
                private readonly float time;
                private readonly int2 dispatchSize;

                public float4 Execute()
                {
                    int2 xy = (int2)D2D.GetScenePosition().XY;
                    float2 uv = xy / (float2)this.dispatchSize;
                    float3 col = 0.5f + (0.5f * Hlsl.Cos(this.time + new float3(uv, uv.X) + new float3(0, 2, 4)));
                    return new(col, 1f);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0x84, 0x13, 0x0E, 0xB3,
                                0xE1, 0xDE,
                                0x00, 0x42,
                                0x93,
                                0x12,
                                0x32,
                                0x15,
                                0x21,
                                0xDF,
                                0x3B,
                                0x00
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => "MyShader";

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => "A hello world effect that displays a color gradient.";

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => "Render";

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => "ComputeSharp.D2D1";

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 12;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 0
                        #define D2D_REQUIRES_SCENE_POSITION

                        #include "d2d1effecthelpers.hlsli"

                        float time;
                        int2 dispatchSize;

                        D2D_PS_ENTRY(Execute)
                        {
                            int2 xy = (int2)D2DGetScenePosition().xy;
                            float2 uv = xy / (float2)dispatchSize;
                            float3 col = asfloat(1056964608U) + (asfloat(1056964608U) * cos(time + float3(uv, uv.x) + float3(0, 2, 4)));
                            return float4(col, asfloat(1065353216U));
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        ref readonly global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer = ref global::System.Runtime.InteropServices.MemoryMarshal.AsRef<global::ComputeSharp.D2D1.Generated.ConstantBuffer>(data);

                        return global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.ToManaged(in buffer);
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static unsafe void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        global::System.Runtime.CompilerServices.Unsafe.SkipInit(out global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer);

                        global::System.Runtime.InteropServices.NativeMemory.Clear(&buffer, (uint)sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer));

                        global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.FromManaged(in shader, out buffer);

                        loader.LoadConstantBuffer(new global::System.ReadOnlySpan<byte>(&buffer, sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer)));
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::System.Runtime.CompilerServices;
                using global::System.Runtime.InteropServices;

                /// <summary>
                /// A type representing the constant buffer native layout for <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                [StructLayout(LayoutKind.Explicit, Size = 12)]
                file struct ConstantBuffer
                {
                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    [FieldOffset(0)]
                    public float time;

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    [FieldOffset(4)]
                    public int2 dispatchSize;
                }

                /// <summary>
                /// A type containing marshalling logic for the constant buffer in shaders of type <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class ConstantBufferMarshaller
                {
                    /// <summary>
                    /// Marshals managed <see cref="global::MyNamespace.MyShader"/> instances to native constant buffer data.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static void FromManaged(in global::MyNamespace.MyShader shader, out ConstantBuffer buffer)
                    {
                        buffer.time = shader.time();
                        buffer.dispatchSize = shader.dispatchSize();
                    }

                    /// <summary>
                    /// Marshals native constant buffer data to managed <see cref="global::MyNamespace.MyShader"/> instances.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static global::MyNamespace.MyShader ToManaged(ref readonly ConstantBuffer buffer)
                    {
                        Unsafe.SkipInit(out global::MyNamespace.MyShader shader);

                        shader.time() = buffer.time;
                        shader.dispatchSize() = buffer.dispatchSize;

                        return shader;
                    }

                    /// <inheritdoc cref="global::MyNamespace.MyShader.time"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.time"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref float time(this ref readonly global::MyNamespace.MyShader value);

                    /// <inheritdoc cref="global::MyNamespace.MyShader.dispatchSize"/>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to <see cref="global::MyNamespace.MyShader.dispatchSize"/>.</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field)]
                    private static extern ref int2 dispatchSize(this ref readonly global::MyNamespace.MyShader value);
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    [TestMethod]
    public async Task SimpleShader_WithPrimaryConstructorParameters()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using int2 = global::ComputeSharp.Int2;
            using float2 = global::ComputeSharp.Float2;
            using float3 = global::ComputeSharp.Float3;
            using float4 = global::ComputeSharp.Float4;

            [assembly: D2DEnableRuntimeCompilation]

            namespace MyNamespace;

            [D2DInputCount(0)]
            [D2DRequiresScenePosition]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader(float time, int2 dispatchSize) : ID2D1PixelShader
            {
                public float4 Execute()
                {
                    int2 xy = (int2)D2D.GetScenePosition().XY;
                    float2 uv = xy / (float2)dispatchSize;
                    float3 col = 0.5f + (0.5f * Hlsl.Cos(time + new float3(uv, uv.X) + new float3(0, 2, 4)));
                    return new(col, 1f);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0xF4, 0xE8, 0x90, 0x26,
                                0x36, 0xE8,
                                0x71, 0x89,
                                0x25,
                                0x1F,
                                0x69,
                                0xE1,
                                0x5F,
                                0x27,
                                0x60,
                                0xBE
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 12;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 0
                        #define D2D_REQUIRES_SCENE_POSITION

                        #include "d2d1effecthelpers.hlsli"

                        float time;
                        int2 dispatchSize;

                        D2D_PS_ENTRY(Execute)
                        {
                            int2 xy = (int2)D2DGetScenePosition().xy;
                            float2 uv = xy / (float2)dispatchSize;
                            float3 col = asfloat(1056964608U) + (asfloat(1056964608U) * cos(time + float3(uv, uv.x) + float3(0, 2, 4)));
                            return float4(col, asfloat(1065353216U));
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        ref readonly global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer = ref global::System.Runtime.InteropServices.MemoryMarshal.AsRef<global::ComputeSharp.D2D1.Generated.ConstantBuffer>(data);

                        return global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.ToManaged(in buffer);
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static unsafe void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        global::System.Runtime.CompilerServices.Unsafe.SkipInit(out global::ComputeSharp.D2D1.Generated.ConstantBuffer buffer);

                        global::System.Runtime.InteropServices.NativeMemory.Clear(&buffer, (uint)sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer));

                        global::ComputeSharp.D2D1.Generated.ConstantBufferMarshaller.FromManaged(in shader, out buffer);

                        loader.LoadConstantBuffer(new global::System.ReadOnlySpan<byte>(&buffer, sizeof(global::ComputeSharp.D2D1.Generated.ConstantBuffer)));
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::System.Runtime.CompilerServices;
                using global::System.Runtime.InteropServices;

                /// <summary>
                /// A type representing the constant buffer native layout for <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                [StructLayout(LayoutKind.Explicit, Size = 12)]
                file struct ConstantBuffer
                {
                    /// <summary>The unspeakable field "time" of <see cref="global::MyNamespace.MyShader"/>.</summary>
                    [FieldOffset(0)]
                    public float time;

                    /// <summary>The unspeakable field "dispatchSize" of <see cref="global::MyNamespace.MyShader"/>.</summary>
                    [FieldOffset(4)]
                    public int2 dispatchSize;
                }

                /// <summary>
                /// A type containing marshalling logic for the constant buffer in shaders of type <see cref="global::MyNamespace.MyShader"/>.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class ConstantBufferMarshaller
                {
                    /// <summary>
                    /// Marshals managed <see cref="global::MyNamespace.MyShader"/> instances to native constant buffer data.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static void FromManaged(in global::MyNamespace.MyShader shader, out ConstantBuffer buffer)
                    {
                        buffer.time = shader.time();
                        buffer.dispatchSize = shader.dispatchSize();
                    }

                    /// <summary>
                    /// Marshals native constant buffer data to managed <see cref="global::MyNamespace.MyShader"/> instances.
                    /// </summary>
                    /// <param name="buffer">The input native constant buffer.</param>
                    /// <returns>The marshalled <see cref="global::MyNamespace.MyShader"/> instance.</returns>
                    [MethodImpl(MethodImplOptions.AggressiveInlining)]
                    [SkipLocalsInit]
                    public static global::MyNamespace.MyShader ToManaged(ref readonly ConstantBuffer buffer)
                    {
                        Unsafe.SkipInit(out global::MyNamespace.MyShader shader);

                        shader.time() = buffer.time;
                        shader.dispatchSize() = buffer.dispatchSize;

                        return shader;
                    }

                    /// <summary>Gets a reference to the unspeakable field "time" of type <see cref="global::MyNamespace.MyShader"/>.</summary>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to the unspeakable field "time".</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "<time>P")]
                    private static extern ref float time(this ref readonly global::MyNamespace.MyShader value);

                    /// <summary>Gets a reference to the unspeakable field "dispatchSize" of type <see cref="global::MyNamespace.MyShader"/>.</summary>
                    /// <param name="value">The input <see cref="global::MyNamespace.MyShader"/> value.</param>
                    /// <returns>A mutable reference to the unspeakable field "dispatchSize".</returns>
                    [UnsafeAccessor(UnsafeAccessorKind.Field, Name = "<dispatchSize>P")]
                    private static extern ref int2 dispatchSize(this ref readonly global::MyNamespace.MyShader value);
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    [TestMethod]
    public async Task SimpleShader_WithInputTypesAndInputDescriptions()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using float4 = global::ComputeSharp.Float4;

            [assembly: D2DEnableRuntimeCompilation]

            namespace MyNamespace;

            [D2DInputCount(2)]
            [D2DInputSimple(0)]
            [D2DInputComplex(1)]
            [D2DInputDescription(0, D2D1Filter.MinMagMipPoint)]
            [D2DInputDescription(1, D2D1Filter.Anisotropic)]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader : ID2D1PixelShader
            {
                public float4 Execute()
                {
                    return D2D.GetInput(0) + D2D.GetInput(1);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0xF4, 0xE8, 0x90, 0x26,
                                0x36, 0xE8,
                                0x71, 0x89,
                                0x25,
                                0x1F,
                                0x69,
                                0xE1,
                                0x5F,
                                0x27,
                                0x60,
                                0xBE
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 2;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => global::ComputeSharp.D2D1.Generated.InputTypesMemoryManager.Instance.Memory;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => global::ComputeSharp.D2D1.Generated.Data.InputDescriptions;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 2
                        #define D2D_INPUT0_SIMPLE
                        #define D2D_INPUT1_COMPLEX

                        #include "d2d1effecthelpers.hlsli"

                        D2D_PS_ENTRY(Execute)
                        {
                            return D2DGetInput(0) + D2DGetInput(1);
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        return default;
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        loader.LoadConstantBuffer(default);
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System;
                using global::System.Buffers;
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::System.Runtime.CompilerServices;
                using global::System.Runtime.InteropServices;
                using global::ComputeSharp.D2D1;
                using global::ComputeSharp.D2D1.Interop;

                /// <summary>
                /// A container type for additional data needed by the shader.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class Data
                {
                    /// <summary>The singleton <see cref="D2D1InputDescription"/> array instance.</summary>
                    public static readonly D2D1InputDescription[] InputDescriptions =
                    [
                        new D2D1InputDescription(0, D2D1Filter.MinMagMipPoint) { LevelOfDetailCount = 0 },
                        new D2D1InputDescription(1, D2D1Filter.Anisotropic) { LevelOfDetailCount = 0 }
                    ];
                }

                /// <summary>
                /// A <see cref="MemoryManager{T}"/> implementation to get the input types.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file sealed class InputTypesMemoryManager : MemoryManager<D2D1PixelShaderInputType>
                {
                    /// <summary>The singleton <see cref="InputTypesMemoryManager"/> instance to use.</summary>
                    public static readonly InputTypesMemoryManager Instance = new();

                    /// <summary>The RVA data with the input type info.</summary>
                    private static ReadOnlySpan<D2D1PixelShaderInputType> Data =>
                    [
                        D2D1PixelShaderInputType.Simple,
                        D2D1PixelShaderInputType.Complex
                    ];

                    /// <inheritdoc/>
                    public override unsafe Span<D2D1PixelShaderInputType> GetSpan()
                    {
                        return new(Unsafe.AsPointer(ref MemoryMarshal.GetReference(Data)), Data.Length);
                    }

                    /// <inheritdoc/>
                    public override Memory<D2D1PixelShaderInputType> Memory
                    {
                        [MethodImpl(MethodImplOptions.AggressiveInlining)]
                        get => CreateMemory(Data.Length);
                    }

                    /// <inheritdoc/>
                    public override unsafe MemoryHandle Pin(int elementIndex)
                    {
                        return new(Unsafe.AsPointer(ref Unsafe.AsRef(in Data[elementIndex])), pinnable: this);
                    }

                    /// <inheritdoc/>
                    public override void Unpin()
                    {
                    }

                    /// <inheritdoc/>
                    protected override void Dispose(bool disposing)
                    {
                    }
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    [TestMethod]
    public async Task SimpleShader_WithResourceTexture()
    {
        const string source = """
            using ComputeSharp;
            using ComputeSharp.D2D1;
            using int2 = global::ComputeSharp.Int2;
            using float4 = global::ComputeSharp.Float4;

            [assembly: D2DEnableRuntimeCompilation]

            namespace MyNamespace;

            [D2DInputCount(0)]
            [D2DRequiresScenePosition]
            [D2DGeneratedPixelShaderDescriptor]
            internal readonly partial struct MyShader : ID2D1PixelShader
            {
                [D2DResourceTextureIndex(0)]
                private readonly D2D1ResourceTexture2D<float> texture;

                public float4 Execute()
                {
                    int2 xy = (int2)D2D.GetScenePosition().XY;
                    return this.texture.Sample(xy);
                }
            }
            """;

        const string result = """"
            // <auto-generated/>
            #pragma warning disable

            namespace MyNamespace
            {
                /// <inheritdoc cref="MyShader"/>
                partial struct MyShader : global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>
                {
                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ref readonly global::System.Guid global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectId
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            global::System.ReadOnlySpan<byte> bytes =
                            [
                                0xF4, 0xE8, 0x90, 0x26,
                                0x36, 0xE8,
                                0x71, 0x89,
                                0x25,
                                0x1F,
                                0x69,
                                0xE1,
                                0x5F,
                                0x27,
                                0x60,
                                0xBE
                            ];

                            return ref global::System.Runtime.CompilerServices.Unsafe.As<byte, global::System.Guid>(ref global::System.Runtime.InteropServices.MemoryMarshal.GetReference(bytes));
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDisplayName => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectDescription => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectCategory => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string? global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectAuthor => null;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static unsafe nint global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.EffectFactory
                    {
                        [global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
                        get
                        {
                            [global::System.Runtime.InteropServices.UnmanagedCallersOnly(CallConvs = [typeof(global::System.Runtime.CompilerServices.CallConvStdcall)])]
                            static int EffectFactory(void** effectImpl)
                            {
                                return global::ComputeSharp.D2D1.Interop.D2D1PixelShaderEffect.CreateEffectUnsafe<MyShader>(effectImpl);
                            }

                            return (nint)(delegate* unmanaged[Stdcall]<void**, int>)&EffectFactory;
                        }
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ConstantBufferSize => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputCount => 0;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static int global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureCount => 1;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1PixelShaderInputType> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputTypes => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1InputDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.InputDescriptions => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<global::ComputeSharp.D2D1.Interop.D2D1ResourceTextureDescription> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ResourceTextureDescriptions => global::ComputeSharp.D2D1.Generated.Data.ResourceTextureDescriptions;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1PixelOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.PixelOptions => global::ComputeSharp.D2D1.D2D1PixelOptions.None;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1BufferPrecision global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.BufferPrecision => global::ComputeSharp.D2D1.D2D1BufferPrecision.Unknown;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ChannelDepth global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ChannelDepth => global::ComputeSharp.D2D1.D2D1ChannelDepth.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1ShaderProfile global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.ShaderProfile => global::ComputeSharp.D2D1.D2D1ShaderProfile.PixelShader50;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static ComputeSharp.D2D1.D2D1CompileOptions global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CompileOptions => global::ComputeSharp.D2D1.D2D1CompileOptions.Default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static string global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslSource =>
                        """
                        #define D2D_INPUT_COUNT 0
                        #define D2D_REQUIRES_SCENE_POSITION

                        #include "d2d1effecthelpers.hlsli"

                        Texture2D<float> __reserved__texture : register(t0);
                        SamplerState __sampler____reserved__texture : register(s0);

                        D2D_PS_ENTRY(Execute)
                        {
                            int2 xy = (int2)D2DGetScenePosition().xy;
                            return __reserved__texture.Sample(__sampler____reserved__texture, xy);
                        }
                        """;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    static global::System.ReadOnlyMemory<byte> global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.HlslBytecode => default;

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static MyShader global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.CreateFromConstantBuffer(global::System.ReadOnlySpan<byte> data)
                    {
                        return default;
                    }

                    /// <inheritdoc/>
                    [global::System.CodeDom.Compiler.GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                    [global::System.Diagnostics.DebuggerNonUserCode]
                    [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
                    [global::System.Runtime.CompilerServices.SkipLocalsInit]
                    static void global::ComputeSharp.D2D1.Descriptors.ID2D1PixelShaderDescriptor<MyShader>.LoadConstantBuffer<TLoader>(in MyShader shader, ref TLoader loader)
                    {
                        loader.LoadConstantBuffer(default);
                    }
                }
            }

            namespace ComputeSharp.D2D1.Generated
            {
                using global::System.CodeDom.Compiler;
                using global::System.Diagnostics;
                using global::System.Diagnostics.CodeAnalysis;
                using global::ComputeSharp.D2D1.Interop;

                /// <summary>
                /// A container type for additional data needed by the shader.
                /// </summary>
                [GeneratedCode("ComputeSharp.D2D1.D2DPixelShaderDescriptorGenerator", <ASSEMBLY_VERSION>)]
                [DebuggerNonUserCode]
                [ExcludeFromCodeCoverage]
                file static class Data
                {
                    /// <summary>The singleton <see cref="D2D1ResourceTextureDescription"/> array instance.</summary>
                    public static readonly D2D1ResourceTextureDescription[] ResourceTextureDescriptions =
                    [
                        new D2D1ResourceTextureDescription(0, 2)
                    ];
                }
            }
            """";

        await VerifyGeneratedDiagnosticsAsync(source, ("MyNamespace.MyShader.g.cs", result));
    }

    /// <summary>
    /// Verifies the output of a source generator.
    /// </summary>
    /// <param name="source">The input source to process.</param>
    /// <param name="result">The expected source to be generated.</param>
    /// <returns>The task for the operation.</returns>
    private static async Task VerifyGeneratedDiagnosticsAsync(string source, (string Filename, string Source) result)
    {
        await CSharpAnalyzerTest<D2DEnableRuntimeCompilationOnAssemblyAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<D2DEnableRuntimeCompilationOnTypeAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<ExceededPixelShaderDispatchDataSizeAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidAssemblyLevelCompileOptionsAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2D1PixelOptionsTrivialSamplingOnShaderTypeAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2DGeneratedPixelShaderDescriptorAttributeTargetAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2DInputDescriptionAttributeUseAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2DRequiresDoublePrecisionSupportAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2DResourceTextureIndexAttributeLocationAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidD2DResourceTextureIndexAttributeUseAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidEffectIdValueAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidEffectMetadataValueAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidShaderTypeCompileOptionsAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<InvalidShaderTypeInputsAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<MissingAllowUnsafeBlocksCompilationOptionAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<MissingPixelShaderDescriptorOnPixelShaderAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<NotAccessibleD2DGeneratedPixelShaderDescriptorAttributeTargetAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<NotAccessibleFieldTypeInD2DGeneratedShaderDescriptorAttributeTargetAnalyzer>.VerifyAnalyzerAsync(source);
        await CSharpAnalyzerTest<NotReadOnlyPixelShaderTypeWithFieldsAnalyzer>.VerifyAnalyzerAsync(source);

        CSharpGeneratorTest<D2DPixelShaderDescriptorGenerator>.VerifySources(source, result);
    }
}